#include "point.h"
#include "utils.h"
#include <QtCore/qmath.h>

Point::Point(double latitude, double longitude, int altitude):
Point2d(latitude, longitude)
{
    this->altitude = altitude;
}

Point::Point(const Point2d & p2d):
Point2d(p2d)
{
    this->altitude = 0;
}

int Point::getAltitude() const
{
    return altitude;
}

void Point::setAltitude(int altitude)
{
    this->altitude = altitude;
}

int Point::x() const
{
    return (Utils::Radius + altitude) * qCos(M_PI * getLatitude() / 180.0) * qCos(M_PI * getLongitude() / 180.0);
}

int Point::y() const
{
    return (Utils::Radius + altitude) * qCos(M_PI * getLatitude() / 180.0) * qSin(M_PI * getLongitude() / 180.0);
}

int Point::z() const
{
    return (Utils::Radius + altitude) * qSin(M_PI * getLatitude() / 180.0);
}

Point & Point::operator+=(const Point &p)
{
    Point2d::operator +=(p);
    altitude += p.getAltitude();
    return *this;
}

Point & Point::operator-=(const Point &p)
{
    Point2d::operator -=(p);
    altitude -= p.getAltitude();
    return *this;
}

inline bool operator==(const Point & p1, const Point & p2)
{
    return p1.getLatitude() == p2.getLatitude() && p1.getLongitude() == p2.getLongitude()
            && p1.getAltitude() == p2.getAltitude();
}

inline bool operator!=(const Point & p1, const Point & p2)
{
    return !(p1 == p2);
}

inline Point operator+(const Point & p1, const Point & p2)
{
    return Point(p1.getLatitude() + p2.getLatitude(), p1.getLongitude() + p2.getLongitude(), p1.getAltitude() + p2.getAltitude());
}

inline Point operator-(const Point & p1, const Point & p2)
{
    return Point(p1.getLatitude() - p2.getLatitude(), p1.getLongitude() - p2.getLongitude(), p1.getAltitude() - p2.getAltitude());
}

inline Point operator-(const Point & p)
{
    return Point(-p.getLatitude(), -p.getLongitude(), -p.getAltitude());
}
